package session08.action;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/*
    监听器实现的方式二：让容器对象同时充当监听器对象
    优点：
    1、代码语法简单；
    2、访问当前容器的组件或子容器无需传参
    3、没有增加额外的Java类文件，有利于文件管理；

    缺点：
    由于一个类只能实现一个接口一次，所以只有一个actionPerformed
    方法，导致所有的点击事件都要写在这个方法内部，然后用if-else分辨，
    违背了单一职责。
 */
public class AlertFrame extends JFrame implements ActionListener {

    private Container contentP;
    private JButton redBtn;
    private JButton greenBtn;

    public AlertFrame(){
        this.setSize(500,500);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.addContent();
        this.setVisible(true);
    }

    private void addContent(){
        this.contentP = this.getContentPane();
        this.contentP.setLayout(new FlowLayout());
        this.contentP.setBackground(Color.GREEN);

        //监听器实现一的绑定代码
//        //产生的是承受者对象（事件源对象）
//        this.redBtn = new JButton("警报");
//        this.redBtn.setActionCommand("red");
//        //产生的是监听器对象
//        MyButtonListener myButtonListener = new MyButtonListener(this);
//        //让事件源对象绑定了监听器对象
//        this.redBtn.addActionListener(myButtonListener);
//
//        this.greenBtn = new JButton("安全");
//        this.greenBtn.setEnabled(false);
//        this.greenBtn.addActionListener(myButtonListener);

        //监听器实现二的绑定代码
//        //产生的是承受者对象（事件源对象）
//        this.redBtn = new JButton("警报");
//        this.greenBtn = new JButton("安全");
//        this.greenBtn.setEnabled(false);
//        //不需要new新的监听器对象，因为当前容器对象就是监听器对象
//        this.redBtn.addActionListener(this);
//        this.greenBtn.addActionListener(this);

        //监听器实现方式三的绑定代码
        //产生的是承受者对象（事件源对象）
        this.redBtn = new JButton("警报");
        this.greenBtn = new JButton("安全");
        this.greenBtn.setEnabled(false);
        /*
            在事件源绑定监听器对象的同时，完成监听器类的实现。
            使用匿名内部类的语法。
            先说这种方式的优劣：
            1、访问当前容器的组件或子容器无需传参
            2、没有增加额外的Java类文件，有利于文件管理
            3、职责单一，每个组件都有自己的监听器类
            唯一的缺点就是：匿名内部类的语法问题
            1、  new 接口(){
                    声明属性；
                    重写方法；
                    新增方法；
                }
            2、 匿名内部类的this 和 外部类的this之间的区别

            3、匿名内部类如果要操作它所在外部类的方法的局部变量，
            只能把该局部变量当成常量（也就是只能访问不能修改它的值）
         */

        this.redBtn.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                AlertFrame.this.contentP.setBackground(Color.RED);
                AlertFrame.this.redBtn.setEnabled(false);
                AlertFrame.this.greenBtn.setEnabled(true);
            }
        });

        this.greenBtn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                AlertFrame.this.contentP.setBackground(Color.GREEN);
                AlertFrame.this.redBtn.setEnabled(true);
                AlertFrame.this.greenBtn.setEnabled(false);
            }
        });


        this.contentP.add(this.redBtn);
        this.contentP.add(this.greenBtn);


        this.addWindowListener(new WindowListener() {
            @Override
            public void windowOpened(WindowEvent e) {
                System.out.println("窗体打开");
            }

            @Override
            public void windowClosing(WindowEvent e) {

            }

            @Override
            public void windowClosed(WindowEvent e) {
                System.out.println("窗体关闭");
            }

            @Override
            public void windowIconified(WindowEvent e) {
                System.out.println("窗体最小化");
            }

            @Override
            public void windowDeiconified(WindowEvent e) {
                System.out.println("窗体非最小化");
            }

            @Override
            public void windowActivated(WindowEvent e) {
                System.out.println("窗体激活");
            }

            @Override
            public void windowDeactivated(WindowEvent e) {
                System.out.println("窗体非激活");
            }
        });

    }

    public Container getContentP() {
        return contentP;
    }

    public void setContentP(Container contentP) {
        this.contentP = contentP;
    }

    public JButton getRedBtn() {
        return redBtn;
    }

    public void setRedBtn(JButton redBtn) {
        this.redBtn = redBtn;
    }

    public JButton getGreenBtn() {
        return greenBtn;
    }

    public void setGreenBtn(JButton greenBtn) {
        this.greenBtn = greenBtn;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        JButton btn = (JButton) e.getSource();//得到事件源对象
        if(btn.getText().equals("警报")) {
            this.contentP.setBackground(Color.RED);
            this.redBtn.setEnabled(false);
            this.greenBtn.setEnabled(true);
        }else {
            this.contentP.setBackground(Color.GREEN);
            this.redBtn.setEnabled(true);
            this.greenBtn.setEnabled(false);
        }
    }
}
